package com.senthink.gl.business.domain.repository;

import com.senthink.gl.business.auth.UserDetailRequest;
import com.senthink.gl.business.common.exception.DataAccessException;
import com.senthink.gl.business.domain.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

/**
 * 用户持久化Repository
 *
 * @author Ethan
 * @date 2017/11/14
 */
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor {

    /**
     * 根据用户的账号或者手机号或者email查找用户信息
     *
     * @param account 账号
     * @param mobile  手机号
     * @return List
     */
    List<User> findByAccountOrMobile(String account, String mobile);

    /**
     * 计算用户的记录数，根据账号
     *
     * @param account 账号
     * @return long
     */
    long countByAccount(String account);

    /**
     * 计算用户的记录数，根据手机号
     *
     * @param mobile  手机号
     * @return long
     */
    long countByMobile(String mobile);


    /**
     * 计算用户的记录数，根据账号，手机号或者email
     *
     * @param account 账号
     * @param mobile  手机号
     * @return long
     */
    long countByAccountOrMobile(String account, String mobile);

    /**
     * 根据用户的账户、邮箱、手机获取用户信息
     *
     * @param account
     * @param mobile
     * @return
     */
    List<User> findByAccountAndMobile(String account, String mobile);


    /**
     * 根据用户的邮箱获取用户信息
     *
     * @param mobile
     * @return
     */
    List<User> findByMobile(String mobile);

    /**
     * 根据账户用户名模糊搜索获取用户分页列表
     *
     * @param account
     * @param name
     * @param pageable
     * @return
     */
    Page<User> findAllByAccountLikeOrNameLikeOrderByAccountDesc(String account, String name, Pageable pageable);

    /**
     * 根据账户获取用户信息
     *
     * @param account
     * @return
     */
    List<User> findByAccount(String account);

    /**
     * 根据uid获取用户详情信息
     *
     * @param uid
     * @return
     */
    @Query(value = "select new com.senthink.gl.business.auth.UserDetailRequest(u.uid , u.name , u.account , u.mobile , u.role , u.remarks) from User u where u.uid=?1")
    List<UserDetailRequest> findDetailByUid(String uid);

    /**
     * 根据uid获取用户信息
     *
     * @param uid
     * @return
     */
    Optional<User> findTopByUid(String uid);

    /**
     * 根据uid删除用户
     *
     * @param uid
     * @return
     */
    @Transactional(rollbackFor = DataAccessException.class)
    int deleteByUid(String uid);

    /**
     * 修改用户密码
     *
     * @param account
     * @param encodePassword
     */
    @Modifying
    @Query("UPDATE User user SET user.password =?2 where user.account =?1 ")
    void resetPw(String account, String encodePassword);

    /**
     * 查询所有管理员用户的手机号码
     *
     * @param roleRoot 恒为ROLE_ROOT
     * @param enable   恒为true
     * @return
     */
    @Query("SELECT DISTINCT u.mobile FROM User u WHERE u.role = ?1 AND u.enable = ?2")
    List<String> findRootPhones(String roleRoot, Boolean enable);
}
